﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ControlsLib;
using System.Linq.Expressions;
using GestionePolveri2.DAL;
using LinqKit;
using System.Data.Objects;
using FrameworkLib.Filters;
using GestionePolveriLib.Facades;
using GestionePolveriLib.BL.FilterBags;
using System.ComponentModel;

namespace GestionePolveriLib.BL.Filters
{
    public class ElencoPrenotazioniFilterBag : FilterBase<Prenotazioni>, IFilterBase, INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        private string m_codicePolvere = string.Empty;

        public string CodicePolvere
        {
            get { return m_codicePolvere; }
            set 
            {
                m_codicePolvere = value;
                NotifyPropertyChanged("CodicePolvere");
            }
        }

        public string Operatore { get; set; }
        public string CodiceColore { get; set; }
        public PrenotazioneStatus Status { get; set; }

        
        private void NotifyPropertyChanged(string info)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(info));
            }
        }

        public ElencoPrenotazioniFilterBag()
        {

        }

        public override Expression<Func<Prenotazioni, bool>> SetUpFilter()
        {
            var predicate = PredicateBuilder.True<Prenotazioni>();

            if (this.UseDates)
            {
                // aggiungi al filtro il controllo sulla data...
                predicate = predicate.And(im => (EntityFunctions.TruncateTime(im.Data) >= EntityFunctions.TruncateTime(this.PeriodFrom)) &&
                                                 EntityFunctions.TruncateTime(im.Data) <= EntityFunctions.TruncateTime(this.PeriodTo));
            }

            switch (Status)
            {
                case PrenotazioneStatus.Annullate:
                    predicate = predicate.And(im => im.IsAnnullata == true);
                    break;
                case PrenotazioneStatus.NonAnnullate:
                    predicate = predicate.And(im => im.IsAnnullata == false); 
                    break;
                case PrenotazioneStatus.Tutte:
                    break;
                default:
                    break;
            }

            //if (!string.IsNullOrWhiteSpace(CodiceColore))
            //{
            //    predicate = predicate.And(im => im.AnagPolveri.ComposizioneColori.Any(x => x.AnagColori.CodiceColore == CodiceColore));
            //}

            if (!string.IsNullOrWhiteSpace(Operatore))
            {
                predicate = predicate.And(im => im.aspnet_Users.UserName == Operatore);
            }

            if (!string.IsNullOrWhiteSpace(CodicePolvere))
            {
                predicate = predicate.And(im => im.AnagPolveri.CodicePolvere == CodicePolvere);
            }



            return predicate;
        }

        public override string ToTraceString()
        {
            string retValue = base.ToTraceString();

            StringBuilder sb = new StringBuilder(base.ToTraceString());

            sb.Append(FilterBagHelper.GetOperatoreTraceString(this.Operatore));
            sb.Append(FilterBagHelper.GetCodicePolvereTraceString(this.CodicePolvere));
            sb.Append(FilterBagHelper.GetCodiceColoreTraceString(this.CodiceColore));

            return sb.ToString();
        }        
    }
}
